/*
 * ContainerNodeObject.h
 *
 *  Created on: 03.10.2012
 *      Author: caffeine
 */

#ifndef CONTAINERNODEOBJECT_H_
#define CONTAINERNODEOBJECT_H_

#include <irrlicht.h>
#include <thread/IMutex.h>

namespace irr{
namespace object{

class ModelObject;
/***
 * @class ContainerNodeObject
 * Класс реализующий работу контейнера. Умеет создавать или удалять контейнер внутри определённого родителя с помощью
 * определённого менаджера сцены. Потоко-безопасен
 */
class ContainerNodeObject:public virtual irr::IReferenceCounted {
private:
	irr::scene::ISceneManager*manager;
	ContainerNodeObject*parent;
	irr::scene::ISceneNode*container_object;
	irr::thread::IMutex*container_mutex;
	irr::core::array<ContainerNodeObject*>childs;
protected:
	friend class ModelObject;
	virtual irr::scene::ISceneNode*createAndGiveNode();
	void createContainer();
	void destroyContainer();
	irr::scene::ISceneNode*getContainer();
	bool isContainerCreated();
public:
	ContainerNodeObject(irr::scene::ISceneManager*manager,ContainerNodeObject*parent);
	virtual ~ContainerNodeObject();
	void setParent(ContainerNodeObject*parent);
	ContainerNodeObject*getParent();
	void addChild(ContainerNodeObject*child);
	ContainerNodeObject*getChild(irr::u32 index);
	void removeChild(irr::u32 index);
	void removeChild(ContainerNodeObject*child);
	irr::s32 indexOf(ContainerNodeObject*child);
	void removeAllChild();
};

}//namespace object
}//namespace irr

#endif /* CONTAINERNODEOBJECT_H_ */
